package models

import (
	"jlpay-sdk-go/pkg/jlpay/core"
)

// OrderQueryRequest 订单查询请求
type OrderQueryRequest struct {
	OrgBaseRequest
	// OutTradeNo 外部交易号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// TradeNo 交易号
	TradeNo string `json:"trade_no,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewOrderQueryRequest 创建订单查询请求
func NewOrderQueryRequest() *OrderQueryRequest {
	req := &OrderQueryRequest{}
	return req
}

// SetOutTradeNo 设置外部交易号
func (r *OrderQueryRequest) SetOutTradeNo(outTradeNo string) *OrderQueryRequest {
	r.OutTradeNo = outTradeNo
	return r
}

// SetTradeNo 设置交易号
func (r *OrderQueryRequest) SetTradeNo(tradeNo string) *OrderQueryRequest {
	r.TradeNo = tradeNo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *OrderQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *OrderQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *OrderQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *OrderQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.OutTradeNo != "" {
		baseMap["out_trade_no"] = r.OutTradeNo
	}
	if r.TradeNo != "" {
		baseMap["trade_no"] = r.TradeNo
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *OrderQueryRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// OrderQueryResponse 订单查询响应
type OrderQueryResponse struct {
	StandardResponse
	// Status 状态
	Status string `json:"status,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// TransactionID 平台订单号
	TransactionID string `json:"transaction_id,omitempty"`
	// OutTradeNo 外部订单号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// ChnTransactionID 渠道订单号
	ChnTransactionID string `json:"chn_transaction_id,omitempty"`
	// TotalAmount 交易金额
	TotalAmount string `json:"total_amount,omitempty"`
	// OrderTime 订单时间
	OrderTime string `json:"order_time,omitempty"`
	// TransTime 交易时间
	TransTime string `json:"trans_time,omitempty"`
	// PayTime 付款时间
	PayTime string `json:"pay_time,omitempty"`
	// TermNo 终端号
	TermNo string `json:"term_no,omitempty"`
	// DeviceNo 终端设备号
	DeviceNo string `json:"device_no,omitempty"`
	// Remark 备注
	Remark string `json:"remark,omitempty"`
	// PayType 交易类型
	PayType string `json:"pay_type,omitempty"`
	// Openid 用户openid
	Openid string `json:"openid,omitempty"`
	// FinalAmount 实际付款金额
	FinalAmount string `json:"final_amount,omitempty"`
}

// NewOrderQueryResponse 创建订单查询响应
func NewOrderQueryResponse() *OrderQueryResponse {
	return &OrderQueryResponse{}
}

// PreOrderRequest 预下单请求
type PreOrderRequest struct {
	OrgBaseRequest
	// TermNo 终端号
	TermNo string `json:"term_no,omitempty"`
	// OutTradeNo 外部交易号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// PaymentValidTime 支付有效期
	PaymentValidTime string `json:"payment_valid_time,omitempty"`
	// Description 商品描述
	Description string `json:"description,omitempty"`
	// Attach 附加数据
	Attach string `json:"attach,omitempty"`
	// TotalAmount 总金额
	TotalAmount string `json:"total_amount,omitempty"`
	// Remark 备注
	Remark string `json:"remark,omitempty"`
	// NotifyURL 通知地址
	NotifyURL string `json:"notify_url,omitempty"`
	// EnvVersion 环境版本
	EnvVersion string `json:"env_version,omitempty"`
	// MerchAppid 商户应用ID
	MerchAppid string `json:"merch_appid,omitempty"`
	// ReturnURL 返回地址
	ReturnURL string `json:"return_url,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewPreOrderRequest 创建预下单请求
func NewPreOrderRequest() *PreOrderRequest {
	req := &PreOrderRequest{}
	return req
}

// SetTermNo 设置终端号
func (r *PreOrderRequest) SetTermNo(termNo string) *PreOrderRequest {
	r.TermNo = termNo
	return r
}

// SetOutTradeNo 设置外部交易号
func (r *PreOrderRequest) SetOutTradeNo(outTradeNo string) *PreOrderRequest {
	r.OutTradeNo = outTradeNo
	return r
}

// SetPaymentValidTime 设置支付有效期
func (r *PreOrderRequest) SetPaymentValidTime(paymentValidTime string) *PreOrderRequest {
	r.PaymentValidTime = paymentValidTime
	return r
}

// SetDescription 设置商品描述
func (r *PreOrderRequest) SetDescription(description string) *PreOrderRequest {
	r.Description = description
	return r
}

// SetAttach 设置附加数据
func (r *PreOrderRequest) SetAttach(attach string) *PreOrderRequest {
	r.Attach = attach
	return r
}

// SetTotalAmount 设置总金额
func (r *PreOrderRequest) SetTotalAmount(totalAmount string) *PreOrderRequest {
	r.TotalAmount = totalAmount
	return r
}

// SetRemark 设置备注
func (r *PreOrderRequest) SetRemark(remark string) *PreOrderRequest {
	r.Remark = remark
	return r
}

// SetNotifyURL 设置通知地址
func (r *PreOrderRequest) SetNotifyURL(notifyURL string) *PreOrderRequest {
	r.NotifyURL = notifyURL
	return r
}

// SetEnvVersion 设置环境版本
func (r *PreOrderRequest) SetEnvVersion(envVersion string) *PreOrderRequest {
	r.EnvVersion = envVersion
	return r
}

// SetMerchAppid 设置商户应用ID
func (r *PreOrderRequest) SetMerchAppid(merchAppid string) *PreOrderRequest {
	r.MerchAppid = merchAppid
	return r
}

// SetReturnURL 设置返回地址
func (r *PreOrderRequest) SetReturnURL(returnURL string) *PreOrderRequest {
	r.ReturnURL = returnURL
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *PreOrderRequest) SetRawRequestMap(rawMap map[string]interface{}) *PreOrderRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *PreOrderRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *PreOrderRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.TermNo != "" {
		baseMap["term_no"] = r.TermNo
	}
	if r.OutTradeNo != "" {
		baseMap["out_trade_no"] = r.OutTradeNo
	}
	if r.PaymentValidTime != "" {
		baseMap["payment_valid_time"] = r.PaymentValidTime
	}
	if r.Description != "" {
		baseMap["description"] = r.Description
	}
	if r.Attach != "" {
		baseMap["attach"] = r.Attach
	}
	if r.TotalAmount != "" {
		baseMap["total_amount"] = r.TotalAmount
	}
	if r.Remark != "" {
		baseMap["remark"] = r.Remark
	}
	if r.NotifyURL != "" {
		baseMap["notify_url"] = r.NotifyURL
	}
	if r.EnvVersion != "" {
		baseMap["env_version"] = r.EnvVersion
	}
	if r.MerchAppid != "" {
		baseMap["merch_appid"] = r.MerchAppid
	}
	if r.ReturnURL != "" {
		baseMap["return_url"] = r.ReturnURL
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *PreOrderRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// PreOrderResponse 预下单响应
type PreOrderResponse struct {
	StandardResponse
	// JlPayAppid 嘉联收银台小程序的appid
	JlPayAppid string `json:"jl_pay_appid,omitempty"`
	// GhID 小程序的原始id
	GhID string `json:"gh_id,omitempty"`
	// CashierURL 收银台地址
	CashierURL string `json:"cashier_url,omitempty"`
}

// NewPreOrderResponse 创建预下单响应
func NewPreOrderResponse() *PreOrderResponse {
	return &PreOrderResponse{}
}

// TradeCancelRequest 交易撤销请求
type TradeCancelRequest struct {
	OrgBaseRequest
	// OutTradeNo 外部交易号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// OriOutTradeNo 原外部交易号
	OriOutTradeNo string `json:"ori_out_trade_no,omitempty"`
	// Remark 备注信息
	Remark string `json:"remark,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewTradeCancelRequest 创建交易撤销请求
func NewTradeCancelRequest() *TradeCancelRequest {
	req := &TradeCancelRequest{}
	return req
}

// SetOutTradeNo 设置外部交易号
func (r *TradeCancelRequest) SetOutTradeNo(outTradeNo string) *TradeCancelRequest {
	r.OutTradeNo = outTradeNo
	return r
}

// SetOriOutTradeNo 设置原外部交易号
func (r *TradeCancelRequest) SetOriOutTradeNo(oriOutTradeNo string) *TradeCancelRequest {
	r.OriOutTradeNo = oriOutTradeNo
	return r
}

// SetRemark 设置备注信息
func (r *TradeCancelRequest) SetRemark(remark string) *TradeCancelRequest {
	r.Remark = remark
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *TradeCancelRequest) SetRawRequestMap(rawMap map[string]interface{}) *TradeCancelRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *TradeCancelRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *TradeCancelRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.OutTradeNo != "" {
		baseMap["out_trade_no"] = r.OutTradeNo
	}
	if r.OriOutTradeNo != "" {
		baseMap["ori_out_trade_no"] = r.OriOutTradeNo
	}
	if r.Remark != "" {
		baseMap["remark"] = r.Remark
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *TradeCancelRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// TradeCancelResponse 交易撤销响应
type TradeCancelResponse struct {
	StandardResponse
	// Status 状态
	Status string `json:"status,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// TransactionID 平台订单号
	TransactionID string `json:"transaction_id,omitempty"`
	// OutTradeNo 外部订单号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// OriOutTradeNo 原外部订单号
	OriOutTradeNo string `json:"ori_out_trade_no,omitempty"`
	// OriTransactionID 原平台订单号
	OriTransactionID string `json:"ori_transaction_id,omitempty"`
	// OrderTime 订单时间
	OrderTime string `json:"order_time,omitempty"`
	// PayType 交易类型
	PayType string `json:"pay_type,omitempty"`
	// TotalAmount 交易金额
	TotalAmount string `json:"total_amount,omitempty"`
	// TransTime 交易时间
	TransTime string `json:"trans_time,omitempty"`
}

// NewTradeCancelResponse 创建交易撤销响应
func NewTradeCancelResponse() *TradeCancelResponse {
	return &TradeCancelResponse{}
}

// TradeRefundRequest 交易退款请求
type TradeRefundRequest struct {
	OrgBaseRequest
	// OutTradeNo 外部交易号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// OriOutTradeNo 原外部交易号
	OriOutTradeNo string `json:"ori_out_trade_no,omitempty"`
	// TotalAmount 退款金额
	TotalAmount string `json:"total_amount,omitempty"`
	// Remark 备注信息
	Remark string `json:"remark,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewTradeRefundRequest 创建交易退款请求
func NewTradeRefundRequest() *TradeRefundRequest {
	req := &TradeRefundRequest{}
	return req
}

// SetOutTradeNo 设置外部交易号
func (r *TradeRefundRequest) SetOutTradeNo(outTradeNo string) *TradeRefundRequest {
	r.OutTradeNo = outTradeNo
	return r
}

// SetOriOutTradeNo 设置原外部交易号
func (r *TradeRefundRequest) SetOriOutTradeNo(oriOutTradeNo string) *TradeRefundRequest {
	r.OriOutTradeNo = oriOutTradeNo
	return r
}

// SetTotalAmount 设置退款金额
func (r *TradeRefundRequest) SetTotalAmount(totalAmount string) *TradeRefundRequest {
	r.TotalAmount = totalAmount
	return r
}

// SetRemark 设置备注信息
func (r *TradeRefundRequest) SetRemark(remark string) *TradeRefundRequest {
	r.Remark = remark
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *TradeRefundRequest) SetRawRequestMap(rawMap map[string]interface{}) *TradeRefundRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *TradeRefundRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *TradeRefundRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.OutTradeNo != "" {
		baseMap["out_trade_no"] = r.OutTradeNo
	}
	if r.OriOutTradeNo != "" {
		baseMap["ori_out_trade_no"] = r.OriOutTradeNo
	}
	if r.TotalAmount != "" {
		baseMap["total_amount"] = r.TotalAmount
	}
	if r.Remark != "" {
		baseMap["remark"] = r.Remark
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *TradeRefundRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// TradeRefundResponse 交易退款响应
type TradeRefundResponse struct {
	StandardResponse
	// Status 状态
	Status string `json:"status,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// TransactionID 平台订单号
	TransactionID string `json:"transaction_id,omitempty"`
	// OutTradeNo 外部订单号
	OutTradeNo string `json:"out_trade_no,omitempty"`
	// ChnTransactionID 渠道订单号
	ChnTransactionID string `json:"chn_transaction_id,omitempty"`
	// OriOutTradeNo 原外部订单号
	OriOutTradeNo string `json:"ori_out_trade_no,omitempty"`
	// OriTransactionID 原平台订单号
	OriTransactionID string `json:"ori_transaction_id,omitempty"`
	// TotalAmount 交易金额
	TotalAmount string `json:"total_amount,omitempty"`
	// OrderTime 订单时间
	OrderTime string `json:"order_time,omitempty"`
	// TransTime 交易时间
	TransTime string `json:"trans_time,omitempty"`
	// PayType 交易类型
	PayType string `json:"pay_type,omitempty"`
}

// NewTradeRefundResponse 创建交易退款响应
func NewTradeRefundResponse() *TradeRefundResponse {
	return &TradeRefundResponse{}
}
